<?php
namespace jm\helper;

/**
* 验证类
*/
class Check
{
    public static $regexpArray = [
        // 手机号码
        'mobile' => '/^1(?:3\d|4[4-9]|5[0-35-9]|6[67]|7[013-8]|8\d|9\d)\d{8}$/',
        // 只有数字
        'digit' => '/^\d+$/',
        // id，大于 0 的正整数
        'id' => '/^[1-9]\d*$/',
    ];

    // 只有数字，不考虑指数计数法；
    public static function isDigit($value)
    {
        $matchCount = preg_match(self::$regexpArray['digit'], $value);
        if ($matchCount === 1) {
            return true;
        }
        return false;
    }

    public static function invalid(&$value, $type = 'id', $option = ['type' => 'include', 'min' => 1, 'max' => 99999])
    {
        return !self::valid($value, $type, $option);
    }

    public static function valid(&$value, $type = 'id', $option = ['type' => 'include', 'min' => 1, 'max' => 99999])
    {
        // 通过引用改变值
        $value = trim($value);

        switch ($type) {
            case 'id':
                return self::id($value);
                break;
            default:
                # code...
                break;
        }
    }

    private static function id(&$value)
    {
        return self::intx($value, ['type' => 'egt']);
    }

    private static function intx(&$value, $option = ['type' => 'include', 'min' => 1, 'max' => 99999])
    {
        // 简单点的正则        
        if (self::isDigit($value)) {
            if (isset($option['type'])) {
                $defaultOption = ['min' => 1, 'max' => 2147483647];
                $min = isset($option['min']) ? $option['min'] : $defaultOption['min'];
                $max = isset($option['max']) ? $option['max'] : $defaultOption['max'];
                switch ($option['type']) {
                    case 'gt':
                        if ($value > $min) {
                            return true;
                        }
                        break;
                    case 'lt':
                        if ($value < $max) {
                            return true;
                        }
                        break;
                    case 'egt':
                        if ($value >= $min) {
                            return true;
                        }
                        break;
                    case 'elt':
                        if ($value <= $max) {
                            return true;
                        }
                        break;
                    case 'include':
                        if ($value <= $max && $value >= $min) {
                            return true;
                        }
                        break;
                    case 'exclude':
                        if ($value < $max && $value > $min) {
                            return true;
                        }
                        break;
                }
            } else if ($value <= $option['max'] && $value >= $option['min']) {
                return true;
            }
        }

        return false;
        
        // 或者复杂点的
        // return !(empty($value) || !is_numeric($value) || (strpos($value, '.') !== false) || (strpos($value, 'e') !== false) || (intval($value) < $option['min']) || (intval($value) > $option['max']));
    }

    // public static function isMobile($mobile)
    // {
    //     // if (self::isDigit($mobile) && strlen($mobile) === 15) {
    //     if (self::isDigit($mobile) && strlen($mobile) === 11) {
    //         // 还应该使用手机号码的正则来验证；
    //         return true;
    //     }
    //     return false;
    // }
}